#include "demo_utils.hpp"

#include <atomic>
#include <cstdint>
#include <thread>
#include <vector>

namespace atomic_examples {
namespace {

constexpr int kThreads = 4;                ///< 并发线程数量。
constexpr int kIterationsPerThread = 100'000; ///< 每个线程执行的累加次数。

/**
 * @brief 演示基于 std::atomic 的高频计数器。
 *
 * 核心要点：
 *  - 使用 `std::atomic<uint64_t>` 保存计数值，避免数据竞争。
 *  - 采用 `memory_order_relaxed`，因为我们只关注最终总数，不需要同步其他数据。
 *  - 将多个线程的累加结果合并，验证计数器的正确性。
 */
void runAtomicCounterDemo() {
  printHeader("Atomic Counter Example");

  std::atomic<std::uint64_t> counter{0}; ///< 全局原子计数器。

  auto worker = [&counter]() {
    for (int i = 0; i < kIterationsPerThread; ++i) {
      counter.fetch_add(1, std::memory_order_relaxed);  ///< ⚡ 高效原子累加，避免锁。
    }
  };

  std::vector<std::thread> workers;
  workers.reserve(kThreads);

  for (int i = 0; i < kThreads; ++i) {
    workers.emplace_back(worker);
  }
  for (auto& t : workers) {
    t.join();
  }

  std::cout << "Expected: " << (kThreads * kIterationsPerThread)
            << ", Actual: " << counter.load(std::memory_order_relaxed) << '\n';
}

} // namespace
} // namespace atomic_examples

int main() {
  atomic_examples::runAtomicCounterDemo();
  return 0;
}